﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ABB.Common.DataModel;

namespace ABB.Common.BusinessLogic.Reporting
{
    /// <summary>
    /// Evaluator für die Report Sortierung, ist fähig Lots
    /// nach mehreren Sortierkriterien zu sortieren.
    /// </summary>
    internal class ReportSortEvaluator
    {
        private readonly IReportDataLoader m_DataLoader;
        private readonly ProjectPlanningDataSet.ReportRow m_Report;
        private readonly ProjectPlanningDataSet.UserRow m_CurrentUser;

        public ReportSortEvaluator(IReportDataLoader dataLoader, ProjectPlanningDataSet.ReportRow report,
                                   ProjectPlanningDataSet.UserRow currentUser)
        {
            if (dataLoader == null) throw new ArgumentNullException("dataLoader");
            if (currentUser == null) throw new ArgumentNullException("currentUser");
            if (report == null) throw new ArgumentNullException("report");

            this.m_DataLoader = dataLoader;
            this.m_Report = report;
            this.m_CurrentUser = currentUser;
        }

        /// <summary>
        /// Gibt eine Sortierte Liste von <see cref="ProjectPlanningDataSet.LotRow"/>-Objekten zurück.
        /// </summary>
        /// <param name="lots">Die Auflistung der Lots, welche zu filtern sind.</param>
        /// <returns></returns>
        public IList<ProjectPlanningDataSet.LotRow> GetSortedList(
                                        IEnumerable<ProjectPlanningDataSet.LotRow> lots)
        {
            // Bei einem Eintrag keine Sortierung durchführen
            if (lots == null || lots.Count() <= 1) return lots.ToList().AsReadOnly();

            // Wenn keine Sortier-Kriterien definiert sind auch die Liste direkt einfach wieder zurück
            // geben.
            var sortCriteria = this.m_Report.GetReportSortCriterionRows();
            if (sortCriteria == null || sortCriteria.Length == 0) return lots.ToList().AsReadOnly();

            // Liste kopieren für die Sortierung
            List<ProjectPlanningDataSet.LotRow> sortedList =
                        new List<ProjectPlanningDataSet.LotRow>(lots);

            ReportSortCriteriaComparer comparer = new ReportSortCriteriaComparer(
                                                                    this.m_DataLoader,
                                                                    this.m_CurrentUser,
                                                                    sortCriteria);
            sortedList.Sort(comparer);

            return sortedList;
        }
    }
}
